package com.zzyl.common.utils.idcard;

import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;

/**
 * 身份证号工具类，用于从身份证号中提取出生日期、计算年龄以及判断性别。
 */
public class IDUtil {
    private static final int ID_CARD_18_LENGTH = 18;
    private static final int ID_CARD_15_LENGTH = 15;
    private static final DateTimeFormatter FORMATTER_18 = DateTimeFormatter.ofPattern("yyyyMMdd");
    private static final DateTimeFormatter FORMATTER_15 = DateTimeFormatter.ofPattern("yyMMdd");

    /**
     * 从身份证号中提取出生日期
     * @param idCard 身份证号
     * @return 出生日期的 LocalDate 对象，如果身份证号格式错误返回 null
     */
    public static LocalDate getBirthDate(String idCard) {
        if (!isValidIdCard(idCard)) {
            return null;
        }
        if (idCard.length() == ID_CARD_18_LENGTH) {
            String birthStr = idCard.substring(6, 14);
            return LocalDate.parse(birthStr, FORMATTER_18);
        } else {
            String birthStr = "19" + idCard.substring(6, 12);
            return LocalDate.parse(birthStr, FORMATTER_18);
        }
    }

    /**
     * 根据身份证号计算年龄
     * @param idCard 身份证号
     * @return 年龄，如果身份证号格式错误返回 -1
     */
    public static int getAge(String idCard) {
        LocalDate birthDate = getBirthDate(idCard);
        if (birthDate == null) {
            return -1;
        }
        LocalDate now = LocalDate.now();
        return Period.between(birthDate, now).getYears();
    }

    /**
     * 根据身份证号判断性别
     * @param idCard 身份证号
     * @return "男" 或 "女"，如果身份证号格式错误返回 null
     */
    public static String getGender(String idCard) {
        if (!isValidIdCard(idCard)) {
            return null;
        }
        String genderStr;
        if (idCard.length() == ID_CARD_18_LENGTH) {
            genderStr = idCard.substring(16, 17);
        } else {
            genderStr = idCard.substring(14, 15);
        }
        int genderNum = Integer.parseInt(genderStr);
        return genderNum % 2 == 0 ? "0" : "1";
    }

    /**
     * 验证身份证号长度是否合法
     * @param idCard 身份证号
     * @return 合法返回 true，不合法返回 false
     */
    private static boolean isValidIdCard(String idCard) {
        return idCard != null && (idCard.length() == ID_CARD_18_LENGTH || idCard.length() == ID_CARD_15_LENGTH);
    }
}